<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>条件表达式</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="functions-sequence.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="functions.html">快退</a></td><td width="60%" align="center" valign="bottom">章9. 函数和操作符</td><td width="10%" align="right" valign="top"><a href="functions.html">快进</a></td><td width="10%" align="right" valign="top"><a href="functions-array.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="FUNCTIONS-CONDITIONAL">9.13. 条件表达式</a></h1><a name="AEN13040"></a><a name="AEN13042"></a>
<p>本节描述在 PostgreSQL 里可用的 SQL 兼容的条件表达式。</p>
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b>如果你的需求超过这些条件表达式的能力，你可能会希望用一种更富表现力的编程语言写一个存储过程。</p>
</blockquote>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="AEN13049">9.13.1. <tt class="LITERAL">CASE</tt></a></h2>
<p><tt class="TOKEN">CASE</tt> 表达式是一种通用的条件表达式，类似于其它语言中的 if/else 语句。</p>
<pre class="SYNOPSIS">CASE WHEN <tt class="REPLACEABLE"><i>condition</i></tt> THEN <tt class="REPLACEABLE"><i>result</i></tt>
     [<span class="OPTIONAL">WHEN ...</span>]
     [<span class="OPTIONAL">ELSE <tt class="REPLACEABLE"><i>result</i></tt></span>]
END</pre>
<p><tt class="TOKEN">CASE</tt> 子句可以用于任何表达式可以存在的地方。<tt class="REPLACEABLE"><i>condition</i></tt> 是一个返回 <tt class="TYPE">boolean</tt> 的表达式。如果结果为真，那么 <tt class="TOKEN">CASE</tt> 表达式的结果就是符合条件的 <tt class="REPLACEABLE"><i>result</i></tt> 。如果结果为假，那么以相同方式搜寻任何随后的 <tt class="TOKEN">WHEN</tt> 子句。如果没有 <tt class="TOKEN">WHEN</tt> <tt class="REPLACEABLE"><i>condition</i></tt> 为真，那么表达式的结果就是在 <tt class="TOKEN">ELSE</tt> 子句里的 <tt class="REPLACEABLE"><i>result</i></tt> 。如果省略了 <tt class="TOKEN">ELSE</tt> 子句且没有匹配的条件，结果为 NULL 。</p>
<p>一个例子：</p>
<pre class="SCREEN">SELECT * FROM test;

 a
---
 1
 2
 3


SELECT a,
       CASE WHEN a=1 THEN 'one'
            WHEN a=2 THEN 'two'
            ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other</pre>
<p>所有 <tt class="REPLACEABLE"><i>result</i></tt> 表达式的数据的类型都必须可以转换成单一的输出类型。参阅<a href="typeconv-union-case.html">节10.5</a>获取细节。</p>
<p>下面这个"简单的" <tt class="TOKEN">CASE</tt> 表达式是上面的通用形式的一个特殊的变种：</p>
<pre class="SYNOPSIS">CASE <tt class="REPLACEABLE"><i>expression</i></tt>
    WHEN <tt class="REPLACEABLE"><i>value</i></tt> THEN <tt class="REPLACEABLE"><i>result</i></tt>
    [<span class="OPTIONAL">WHEN ...</span>]
    [<span class="OPTIONAL">ELSE <tt class="REPLACEABLE"><i>result</i></tt></span>]
END</pre>
<p>先计算 <tt class="REPLACEABLE"><i>expression</i></tt> 的值，然后与所有 <tt class="TOKEN">WHEN</tt> 子句里声明的 <tt class="REPLACEABLE"><i>value</i></tt> 对比，直到找到一个相等的。如果没有找到匹配的，则返回在 <tt class="TOKEN">ELSE</tt> 子句里的 <tt class="REPLACEABLE"><i>result</i></tt>(或者 NULL)。这个类似于 C 里的 <code class="FUNCTION">switch</code> 语句。</p>
<p>上面的例子可以用简单 <tt class="TOKEN">CASE</tt> 语法来写：</p>
<pre class="SCREEN">SELECT a,
       CASE a WHEN 1 THEN 'one'
              WHEN 2 THEN 'two'
              ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other</pre>
<p><tt class="TOKEN">CASE</tt> 表达式并不计算任何对于判断结果并不需要的子表达式。比如，下面是一个可以避免被零除的方法：</p>
<pre class="PROGRAMLISTING">SELECT ... WHERE CASE WHEN x &lt;&gt; 0 THEN y/x &gt; 1.5 ELSE false END;</pre>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="AEN13099">9.13.2. <tt class="LITERAL">COALESCE</tt></a></h2><a name="AEN13102"></a><a name="AEN13104"></a><a name="AEN13106"></a>
<pre class="SYNOPSIS"><code class="FUNCTION">COALESCE</code>(<tt class="REPLACEABLE"><i>value</i></tt> [<span class="OPTIONAL">, ...</span>])</pre>
<p><code class="FUNCTION">COALESCE</code> 返回它的第一个非 NULL 的参数值。它常用于在显示数据时用缺省值替换 NULL 。比如：</p>
<pre class="PROGRAMLISTING">SELECT COALESCE(description, short_description, '(none)') ...</pre>
<p>和 <tt class="TOKEN">CASE</tt> 表达式一样，<code class="FUNCTION">COALESCE</code> 不会计算不需要用来判断结果的参数；也就是说，在第一个非空参数右边的参数不会被计算。这个符合 SQL 标准的函数提供了与某些其它数据库系统中的 <code class="FUNCTION">NVL</code> 和 <code class="FUNCTION">IFNULL</code> 类似的功能。</p>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="AEN13120">9.13.3. <tt class="LITERAL">NULLIF</tt></a></h2><a name="AEN13123"></a>
<pre class="SYNOPSIS"><code class="FUNCTION">NULLIF</code>(<tt class="REPLACEABLE"><i>value1</i></tt>, <tt class="REPLACEABLE"><i>value2</i></tt>)</pre>
<p>当且仅当 <tt class="REPLACEABLE"><i>value1</i></tt> 和 <tt class="REPLACEABLE"><i>value2</i></tt> 相等时，<code class="FUNCTION">NULLIF</code> 才返回 NULL 。否则它返回 <tt class="REPLACEABLE"><i>value1</i></tt> 。这些可以用于执行上面给出的 <code class="FUNCTION">COALESCE</code> 例子的反例：</p>
<pre class="PROGRAMLISTING">SELECT NULLIF(value, '(none)') ...</pre>
<p>如果 <tt class="REPLACEABLE"><i>value1</i></tt> 是 <tt class="LITERAL">(none)</tt> 那么返回 NULL ，否则返回 <tt class="REPLACEABLE"><i>value1</i></tt> 。</p>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="AEN13140">9.13.4. <tt class="LITERAL">GREATEST</tt> 和 <tt class="LITERAL">LEAST</tt></a></h2><a name="AEN13144"></a><a name="AEN13146"></a>
<pre class="SYNOPSIS"><code class="FUNCTION">GREATEST</code>(<tt class="REPLACEABLE"><i>value</i></tt> [<span class="OPTIONAL">, ...</span>])</pre>
<pre class="SYNOPSIS"><code class="FUNCTION">LEAST</code>(<tt class="REPLACEABLE"><i>value</i></tt> [<span class="OPTIONAL">, ...</span>])</pre>
<p><code class="FUNCTION">GREATEST</code> 和 <code class="FUNCTION">LEAST</code> 函数从一个任意数字表达式的列表里选取最大或者最小的数值。这些表达式必须都可以转换成一个普通的数据类型，它将会是结果类型(参阅<a href="typeconv-union-case.html">节10.5</a>获取细节)。列表中的 NULL 值将被忽略。只有所有表达式的结果都是 NULL 的时候，结果才会是 NULL 。</p>
<p>请注意 <code class="FUNCTION">GREATEST</code> 和 <code class="FUNCTION">LEAST</code> 都不是 SQL 标准，但却是很常见的扩展。</p>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="functions-sequence.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="functions-array.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">序列操作函数</td><td width="34%" align="center" valign="top"><a href="functions.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">数组函数和操作符</td></tr>
</table>
</div>
</body></html>